package com.czh.controller;

import com.czh.service.AsyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 多线程的使用场景：异步任务处理、并发请求处理、定时任务、并行计算、分布式调度
 *
 * @author chenzhihua
 * @Date 2024/8/7
 */
@RestController
@Slf4j
public class AsyncController {

    @Resource
    private AsyncService asyncService;


    /**
     * 模拟一个用户注册需要发送邮件的功能: 异步任务处理
     *
     * @return
     */
    @GetMapping("/register")
    public void registerUser() {
        asyncService.registerUser();
    }

    /**
     * 模拟电商平台的库存管理和订单管理：并发请求处理
     */
    @GetMapping("concurrent/request")
    public String concurrentRequest() {
        asyncService.concurrentRequest();
        return "并发请求完成";
    }

    /**
     * 定时任务 @see com.czh.scheduled.threadPollScheduled
     */
    @GetMapping("schedule/task")
    public String scheduledTask() {
        return "";
    }

    /**
     * 并行计算: 用户下单时进行价格计算、库存检查和推荐商品生成
     */
    @GetMapping("parallel/computing")
    public CompletableFuture<List<String>> parallelComputing() {
        log.info("当前执行线程的时间");
        CompletableFuture<List<String>> stringList = asyncService.parallelComputing();
        log.info("main推荐的商品是：{}", stringList.join());
        return stringList;
    }
}
